/* Variabili globali */
var vett = new Array();
var vett1 = new Array();
var descr = new Array();
var url;
var cond;
var tooltip;
var marker;
var lat_utente;
var long_utente;
var map;
var dist;
var infowindow = null;
var $narratore_utilizzato = "narratore-mappa";
var aggregatori = new Array("farmacie", "supermarket", "poste", "scuolematerne");
Array.prototype.clear = function() {
    this.splice(0, this.length);
};

/* Funzione che quando premo 'invio' sull'indirizzo, cambia il marker*/

 function changeLocation(){
	$('#indirizzo-utente').keypress(function(event){
		// Controllo se il browser gestisce l'evento keyCode. Se si utilizzo quello, altrimenti il which
		var KeyCode = (event.keyCode ? event.keyCode : event.which); 
		if (KeyCode=='13'){ 		// Controllo se e' stato premuto l'invio
			trova_indirizzo();
		}
	});
	// Se l'utente clicca su "rileva posizione" viene invocata la funzione geoloc che permette di geolocalizzare la posizione dell'utente
	$('#cambia-posizione').bind("click",geoloc);
}

/*Effettua la geolocalizzazione e invia i dati a markerUtente*/
 
function geoloc(){
	if(navigator.geolocation) {
		navigator.geolocation.getCurrentPosition(function(position) {
			var pos = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
			var myOptions2 = {
				zoom: 14,
				center: pos,
				mapTypeId: google.maps.MapTypeId.ROADMAP
			};
			map = new google.maps.Map(document.getElementById("googleMap"), myOptions2);
  			markerUtente(pos,map);
  			

		}, function() {
			handleNoGeolocation(true);
		});
	}
	else {
		// Se il Browser non supporta la geolocalizzazione si richiama l'handler con False
		handleNoGeolocation(false);
	}
}

/*Funzione che valuta gli errori della mancata geolocalizzazione*/

function handleNoGeolocation(Err_flag){
	if (Err_flag) {
		alert("Servizio di geolocalizzazione fallito");
	}
	else{
		alert("Il browser corrente non supporta il servizio di geolocalizzazione");
	}
}

/*Dal valore inserito nel campo dell'indirizzo, ricaviamo, tramite geocoder, il punto indicato nell'indirizzo
 e lo inviamo a markerUtente*/

function trova_indirizzo ()
{
  	var address = document.getElementById("indirizzo-utente").value;
	
	var geocoder = new google.maps.Geocoder();
	geocoder.geocode( {'address': address}, function(results,status) {
        if (status == google.maps.GeocoderStatus.OK) {
		
			var options = {
  				zoom: 14,
  				center: results[0].geometry.location,
  				mapTypeId: google.maps.MapTypeId.ROADMAP
			};	

			var map = new google.maps.Map(document.getElementById('googleMap'), options);
	
			markerUtente(results[0].geometry.location,map);
			
        } else {
          alert("Problema nella ricerca dell'indirizzo: " + status);
        }
	});	
}

/*Seleziona il narratore da utilizzare. In base a quello che noi clicchiamo salviamo il nome del narratore
 in narratore_nuovo per poi salvarlo nella variabile globale narratore_utilizzato*/


function seleziona_narratore(){
	$('#seleziona_narr a').click(function() {		// attesa del click su uno dei tre pulsanti
		var $narratore_nuovo = $(this).attr('title');				// salvataggio del narratore che l'utente ha deciso di utilizzare
		
		$('#narratore').find('div').each(function(){
			var $id = $(this).attr('id');
			if($id== $narratore_utilizzato){
				$("#" + $narratore_utilizzato).hide();
			}
			if($id== $narratore_nuovo){
				$('#' + $narratore_nuovo).show();
			}
		});		
		
		$narratore_utilizzato = $narratore_nuovo;
		
	});
}


/*vediamo quali aggregatori abbiamo selezionato e li salviamo nel formato "agg1/agg2/..."*/

function trova_aggregatori(){
	var aggregatori_selezionati = "";
	for(var i = 0; i < aggregatori.length; i++){
			var aggr = $("#aggregatori input[type=checkbox][name="+aggregatori[i]+"]:checked").val();
			if (aggr != null){
				aggregatori_selezionati += aggr + '/'
			}			
	}
	return aggregatori_selezionati;
}


/*Questa funzione gestisce le ricerche, in base al descrittore che utilizziamo.*/

function impostaRicerca(){
	
	$('#nome').keypress(function(event){
		// Controllo se il browser gestisce l'evento keyCode. Se si utilizzo quello, altrimenti il which
		var KeyCode = (event.keyCode ? event.keyCode : event.which); 
		if (KeyCode=='13'){ 		// Controllo se e' stato premuto l'invio
			trovapernome();
		}
	});
	
	$('#vicino').keypress(function(event){
		// Controllo se il browser gestisce l'evento keyCode. Se si utilizzo quello, altrimenti il which
		var KeyCode = (event.keyCode ? event.keyCode : event.which); 
		if (KeyCode=='13'){ 		// Controllo se e' stato premuto l'invio
			vicinoA();
		}
	});
	
	$('#raggio').keypress(function(event){
		// Controllo se il browser gestisce l'evento keyCode. Se si utilizzo quello, altrimenti il which
		var KeyCode = (event.keyCode ? event.keyCode : event.which); 
		if (KeyCode=='13'){ 		// Controllo se e' stato premuto l'invio
			entroRaggio();
		}
	});
}

/*Funzione che fa la richiesta ajax per il descrittore trovapernome ed invia tutti i dati a costruiscinarratore*/

function trovapernome(){
	vett = Array();
	vett1 = Array();
	var input = document.getElementById("nome").value;
	var found = false;
	var checked = null;
	
	// Viene "ridisegnata" la mappa e si vanno a vedere quali attività l'utente ha selezionato			
	showMap();
	checked = trova_aggregatori();
	
	// Se non è stata selezionata almeno una tipologia di servizi si genera un errore e non viene fatta la richiesta al server				
	if (checked == ""){
		alert("Attenzione! Non hai scelto nessuna tipologia di servizio da visualizzare!");
	}
	else{
		// Se non è stato inserito nulla da cercare si genera un errore e non viene fatta la richiesta al server
		if(input == ""){
			alert("Non avete inserito il nome da cercare!");
		}
		else{
			// Inoltriamo la richiesta Ajax "trovapernome" settando correttamente i parametri
			url = "http://127.0.0.1:8000/trovapernome/" + checked + "params/" + input + "/";
				
			$.ajax({
				 headers: { Accept : "application/xml",
        		"Content-Type": "application/xml"},
				type: "GET",
				dataType:"xml",
				url: url,	
				async:false,
				error: function(){
					alert("Si è verificato un errore nella ricerca per nome!");
				},
				success: function(xml){
					found = costruisciNarratore(xml);
					creatabella(url);
					if(!found) alert("La ricerca non da nessun risultato");
				}		
			});
		}
	}
}

function creatabella(url){
	
$('#list1').jqGrid('GridUnload');
$("#list1").jqGrid({
		
		url : url,
		datatype : "xml",
		mtype : "GET",
        colNames : ['Categoria', 'Nome', 'Indirizzo','Telefono', 'lat', 'long'],
        colModel : [{name : 'category', index : 'id',xmlmap : "category", width : 200, align:"center"}, 
        			{name : 'name',index : 'name',xmlmap : "name", width : 200, formatter: stato, align:"center"}, 
        			{name : 'address',index : 'address',xmlmap : "address", width : 300, align:"center"},
        			{name : 'tel',index : 'tel',xmlmap : "tel", align:"center"},
        			{name : 'lat',index : 'lat', hidden:"True", xmlmap : function (obj) {
                return $(obj).attr('lat');
            }},
        			{name : 'long',index : 'long', hidden:"True", xmlmap : function (obj) {
                return $(obj).attr('long');
            }}],
        ondblClickRow: function(id) {
        	//prende dalla cella l'indirizzo per la minimappa
        	lat1 = $('#list1').jqGrid('getCell',id,'lat');
        	long1 = $('#list1').jqGrid('getCell',id,'long');
        	if ($('#list1').jqGrid('getCell',id,'category')=="farmacia") aggr = "farmacie";
        	if ($('#list1').jqGrid('getCell',id,'category')=="Supermarket") aggr = "supermarket";
        	if ($('#list1').jqGrid('getCell',id,'category')=="Scuola Materna") aggr = "scuolematerne";
        	if ($('#list1').jqGrid('getCell',id,'category')=="Poste e Telegrafi") aggr = "poste";
        	var indir = $('#list1').jqGrid('getCell',id,'address');
        	
    	 $('#dialog').dialog('open');
    	 distanza_tab(lat1,long1,id,aggr);
    	 minimappa(indir);
    	 
  			},
        width: 740,
        height: 470,
        rowNum : 20,
        rowList : [20, 40, 80],
        pager: jQuery('#pager1'),
        sortname: 'id',
        gridview: true,
        loadonce : true,
        xmlReader : {
            root : "locations",
            row : "location",
            repeatitems : false,
            //id : "id"	
        },
       	viewrecords: true,
    	sortorder: "desc",
    	caption:"Tabella",
    	gridComplete: function (){
					//quando la griglia è completa controlla il dizionario vett1[id : cond] e a seconda dello stato colora la riga di verde o di rosso
						for (var i = 0; i < vett.length; i++) {
            
                    		if(vett1[vett[i]] == "aperto") {
                        				$("#" + vett[i]).find("td").css("background-color", "#9aff9a");
                        //$("#" + vett[i]).find("td").css("color", "silver");
                      		 }
                       		else {
                       				 $("#" + vett[i]).find("td").css("background-color", "#ff9a9a");
                        //$("#" + vett[i]).find("td").css("color", "silver");
                       			}
                    	 }
	                }
    					
    }).navGrid('#pager1',{edit:false,add:false,del:false});
    $("#dialog").dialog( { modal:true, autoOpen: false } );
  
}

function minimappa(ind){

	var geocoder = new google.maps.Geocoder();
	geocoder.geocode( {address: ind}, function(results,status) {
        if (status == google.maps.GeocoderStatus.OK) {
		
			var options = {
  				zoom: 12,
  				center: results[0].geometry.location,
  				mapTypeId: google.maps.MapTypeId.ROADMAP
			};	

			var map = new google.maps.Map(document.getElementById("minimap"), options);
        	var marker = new google.maps.Marker({position: results[0].geometry.location, map: map, title: ind});
			marker.setMap(map);
			
        } else {
          alert("Problema nella ricerca dell'indirizzo: " + status);
        }
	});	
}
function stato (cellvalue, options, rowObject) {
	//crea il vettore vett che contiene gli id delle farmacie prendendolo dalla cella della tabella
	  vett[vett.length] = options.rowId;
        return cellvalue;
}
    

/*Funzione che fa la richiesta ajax per il descrittore vicinoa ed invia tutti i dati a costruiscinarratore*/
    
function vicinoA(){
	vett = Array();
	vett1 = Array();
	var input = document.getElementById("vicino").value;
	var found = false;
	var checked = null;
	
	// Viene "ridisegnata" la mappa e si vanno a vedere quali attività l'utente ha selezionato			
	showMap();
	checked = trova_aggregatori();
	
	// Se non è stata selezionata almeno una tipologia di servizi si genera un errore e non viene fatta la richiesta al server				
	if (checked == ""){
		alert("Attenzione! Non hai scelto nessuna tipologia di servizio da visualizzare!");
	}
	else{
		// Se non è stato inserito nulla da cercare si genera un errore e non viene fatta la richiesta al server
		if(input == ""){
			alert("Non avete inserito il numero di posti da cercare!");
		}
		else{
			url = "http://127.0.0.1:8000/vicino_a/" + checked + "params/" + lat_utente +'/' + long_utente + '/' + input;
			// Inoltriamo la richiesta Ajax "vicino_a" settando correttamente i parametri
			$.ajax({
				 headers: { Accept : "application/xml",
        		"Content-Type": "application/xml"},
				type: "GET",
				dataType:"xml",
				url: url,	
				async:true,
				error: function(){
					alert("Si è verificato un errore nella ricerca per i posti vicino al marker!");
				},
				success: function(xml){
					creatabella(url);
					found = costruisciNarratore(xml);
				}		
			});
		}
	}
}


/*Funzione che fa la richiesta ajax per il descrittore entroraggio ed invia tutti i dati a costruiscinarratore*/

function entroRaggio(){
	vett = Array();
	vett1 = Array();
	var input = document.getElementById("raggio").value;
	var found = false;
	var checked = null;
	
	// Viene "ridisegnata" la mappa e si vanno a vedere quali attività l'utente ha selezionato			
	showMap();
	checked = trova_aggregatori();
	
	// Se non è stata selezionata almeno una tipologia di servizi si genera un errore e non viene fatta la richiesta al server				
	if (checked == ""){
		alert("Attenzione! Non hai scelto nessuna tipologia di servizio da visualizzare!");
	}
	else{
		// Se non è stato inserito nulla da cercare si genera un errore e non viene fatta la richiesta al server
		if(input == ""){
			alert("Non avete inserito la distanza!");
		}
		else{
			// Inoltriamo la richiesta Ajax "entro_raggio" settando correttamente i parametri
			url = "http://127.0.0.1:8000/entro_raggio/" + checked + "params/" + lat_utente +'/' + long_utente + '/' + input;
			$.ajax({
				 headers: { Accept : "application/xml",
        		"Content-Type": "application/xml"},
				type: "GET",
				dataType:"xml",
				url: url,	
				async:false,
				error: function(){
					alert("Si è verificato un errore nella ricerca!");
				},
				success: function(xml){
					creatabella(url);
					found = costruisciNarratore(xml);
					if(!found) alert("Non ci sono luoghi entro il raggio indicato.");
				}		
			});
		}
	}
}


/*Funzione che dal file xml della richiesta (per nome, etc.) divide i campi e li inviamo alla 
 funzione distanza*/

function costruisciNarratore(xml){
	var found = false;
	
		$(xml).find('location').each(function(){
			var current_id = $(this).attr("id");
			var current_lat = $(this).attr("lat");
			var current_lng = $(this).attr("long");
			var current_name = $(this).find('name').text();
			var current_category = $(this).find('category').text();
			var current_address = $(this).find('address').text();
			var current_tel = $(this).find('tel').text();
			var  current_opening = $(this).find('opening').first().text();
			// Aggregatore settato in base alla categoria
			if(current_category.indexOf("farmacia")!=-1) current_aggr= "farmacie";
			if(current_category.indexOf("Supermarket")!=-1) current_aggr= "supermarket";
			if(current_category.indexOf("Poste")!=-1) current_aggr= "poste";
			if(current_category.indexOf("Scuola")!=-1) current_aggr= "scuolematerne";
			// chiamata alla funzione distanza
			open=current_opening.split(" ").join("");
			open=open.toLowerCase();
			cond = eAperto(open);
			vett1[current_id] = cond;
			//distanza(current_lat, current_lng,current_id,current_name,current_address,current_tel,current_category,current_aggr,current_opening); 
			make_mappa(current_id,current_category,current_name,current_lat,current_lng,current_aggr,cond);		
			found = true;										
		});
	//}
	
	return found;
}


/*Calcoliamo la distanza del punto dal marker, chiamiamo la funzione eAperto per verificare l'apertura
 e inviamo i dati a make_mappa*/

function distanza(latp,longp,id,aggr,marker2)
{
		
	$.ajax({
		type: "get",
		url: 'http://127.0.0.1:8000/distanza/params/' + longp + '/' + latp + '/' + long_utente + '/' + lat_utente,
		dataType:"text",
		success: function(dist1){
			descrizione_mappa(id,aggr,dist1,cond,marker2);
			 
		},
		error: function(){
			alert("Si è verificato un errore nel calcolo della distanza!");
		}
	});
	
}

function distanza_tab(latp,longp,id,aggr)
{
		
	$.ajax({
		type: "get",
		url: 'http://127.0.0.1:8000/distanza/params/' + longp + '/' + latp + '/' + long_utente + '/' + lat_utente,
		dataType:"text",
		success: function(dist2){
			document.getElementById("descr").innerHTML = descrizione(id,aggr,dist2,cond);			 
		},
		error: function(){
			alert("Si è verificato un errore nel calcolo della distanza!");
		}
	});
	
}

/*Partendo dalla posizione attuale salvata su marker, visualizziamo la mappa e 
 inviamo i dati a markerUtente*/

function showMap(){
	var userpos = marker.getPosition();
	var myOptions = {
		zoom: 14,
		center: userpos,
		mapTypeId: google.maps.MapTypeId.ROADMAP
	};
	map = new google.maps.Map(document.getElementById("googleMap"), myOptions);
	markerUtente(userpos, map);
}


/*Partendo dalla posizione attuale e dalla mappa costruita su showMap mi posiziona il marker sulla
 mappa e mi gestisce la funzione di riposizionamento del marker in caso lo si sposta manualmente*/

function markerUtente(latlng, map){
	lat_utente = latlng.lat();
	long_utente = latlng.lng();
	// centra la mappa alle coordinate latlng
	map.panTo(latlng); 
	var geocoder = new google.maps.Geocoder();
	geocoder.geocode( {'latLng': latlng}, function(results, status) {
		if (status == google.maps.GeocoderStatus.OK) {
			if (results[0]) $("#indirizzo-utente").val(results[1].formatted_address); 
		}
		});
	// Posizionamento del marker dell utente sulla mappa map
		marker = new google.maps.Marker({
		position: latlng, 
		map: map,
		title: 'Tu ti trovi qui!',
		icon: 'media/immagini/marker_user.png',
		animation: google.maps.Animation.DROP,
		draggable: true
	});
	// aggiungiamo al marker dell'utente un listner nel caso il marker venga spostato di posizione, aggiornando ogni valore necessario
	google.maps.event.addListener (marker, 'dragend', function (event){
		latlng = marker.getPosition();
		map.panTo(latlng);
		lat_utente = latlng.lat();
		long_utente = latlng.lng();
		var geocoder = new google.maps.Geocoder();
		geocoder.geocode( {'latLng': latlng}, function( results, status) {
			if (status == google.maps.GeocoderStatus.OK) {
				if (results[0]) $("#indirizzo-utente").val(results[1].formatted_address);
			}
		});
	});
}

/*fa una richiesta per richiedere la descrizione la elabora e la invia alla funzione che la richiede*/

function descrizione (id,aggr,dist,cond)
{
	var result='';
	$.ajax({
		type: "get",
		url: 'http://127.0.0.1:8000/descrizione/' + aggr + '/params/' + id,
		dataType:"html",
		async:false,    /*scelta da fare, cioe aspettare oppure fare uno alla volta a scatti*/
		success: function(descr){	
			result=descr;
		},
		error: function(){
			alert("Si è verificato un errore nel calcolo della descrizione!");
		}
	});
     tooltip = '<div id="tooltip">'+result+'<br>Distanza: <b>'+dist+'</b><br>Stato: <b>'+cond+'</b></div>';
     //descr[id] = tooltip;
   	return tooltip;
}
function descrizione_mappa (id,aggr,dist,cond,marker2)
{
	var result='';
	$.ajax({
		type: "get",
		url: 'http://127.0.0.1:8000/descrizione/' + aggr + '/params/' + id,
		dataType:"html",
		async:false,    /*scelta da fare, cioe aspettare oppure fare uno alla volta a scatti*/
		success: function(descr){	
			result=descr;	
			contenuto = '<div id="tooltip">'+result+'<br>Distanza: <b>'+dist+'</b><br>Stato: <b>'+cond+'</b></div>';
			infowindow.setContent(contenuto);
			infowindow.open(map,marker2);
		},
		error: function(){
			alert("Si è verificato un errore nel calcolo della descrizione!");
		}
	});
}
/*date un intervallo di ore e un giorno ci dice se un determinato luogo e' aperto o meno*/

function eAperto(open)
{
	var range_dalle=$("#dalle").text(); 	
	range_dalle=range_dalle.replace(":","");	
	var range_alle=$("#alle").text();	
	range_alle=range_alle.replace(":","");
    var dat= $("#dataC").val();
    dat=dat.toString().substring(0,3);
    dat = trasforma_giorno(dat);
	var dataOra= dat+":"+range_dalle+"-"+range_alle;
	var result='';
	
	$.ajax({
		type: "get",
		url: 'http://127.0.0.1:8000/aperto/params/' + open + '/' + dataOra,
		dataType:"html",
		async:false,    
		success: function(open){	
			result=open;	
		},
		error: function(){
			alert("Si è verificato un errore nel calcolo dell apertura!");
		}
	});
   	return result;

}

/*trasforma i giorni dall italiano all inglese.*/

function trasforma_giorno(giorno){
	var nome_ing;
	switch(giorno){
		case 'Dom':
			nome_ing = 'sun';
			break;
		case 'Lun':
			nome_ing = 'mon';	
			break;
		case 'Mar':
			nome_ing = 'tue';
			break;
		case 'Mer':
			nome_ing = 'wed';
			break;
		case 'Gio':
			nome_ing = 'thu';
			break;
		case 'Ven':
			nome_ing = 'fri';
			break;
		case 'Sab':
			nome_ing = 'sat';
			break;
		default:
			nome_ing = 'Err';
	}
	return nome_ing;
}

function loadContent(id,aggr,cond,lat,lon){	
		distanza(lat,lon,id,aggr);
	}
/*Date le informazioni su di un luogo, le elabora nella mappa, caricando nella finestra del 
 luogo la descrizione*/

function make_mappa(id,category,name,lat,lon,aggr,cond){
	var type = category;
	var latlng = new google.maps.LatLng(lat,lon);

	// viene aggiunto il marker a seconda della categoria
	var marker_icon;
	if(type.indexOf("farmacia")!=-1) marker_icon = "marker_farmacie.png";
	if(type.indexOf("Supermarket")!=-1) marker_icon = "marker_supermercati.png";
	if(type.indexOf("Scuola")!=-1) marker_icon = "marker_scuola.png";
	if(type.indexOf("Poste")!=-1) marker_icon = "marker_posta.png";
	
	var marker2 = new google.maps.Marker({ 
      		position: latlng,
			map: map,
			title: name,
			icon: 'media/immagini/'+ marker_icon,
			animation: google.maps.Animation.DROP,
	});
	
	type = type.toString().toUpperCase();
	name = name.toUpperCase();
	google.maps.event.addListener(marker2, 'click', function() {
	 if (infowindow) {
         infowindow.close();
     }
     		infowindow = new google.maps.InfoWindow();
     	distanza(lat,lon,id,aggr,marker2);	
		//infowindow.open(map,marker2);
		
	});

	


}